{ "cells": [ { "cell_type": "markdown", "id": "specific-boulder", "metadata": {}, "source": [ "# Salsa al Parque - Solución" ] }, { "cell_type": "markdown", "id": "written-elephant", "metadata": {}, "source": [ "Tags: Parámetro binario, Variable Binaria, Scheduling" ] }, { "cell_type": "code", "execution_count": 1, "id": "fe8c0d77", "metadata": { "tags": [ "hide-input", "thebe-init" ] }, "outputs": [], "source": [ "import os\n", "# Por precaución, cambiamos el directorio activo de Python a aquel que contenga este notebook\n", "if \"optimizacion\" in os.listdir():\n", " os.chdir(r\"optimizacion/Formulaciones/8. Salsa al parque/\")" ] }, { "cell_type": "markdown", "id": "annoying-circus", "metadata": {}, "source": [ "## Enunciado\n", "\n", "" ] }, { "cell_type": "markdown", "id": "01476fd4", "metadata": {}, "source": [ "El comité organizador del festival *Salsa al Parque* te ha contratado para definir el horario en el que se presentará cada uno de los cinco artistas principales. El comité le ha indicado que los artistas deben ser asignados a lo largo de una franja de 12 horas. En particular, hay un conjunto $A$ de artistas y un conjunto $H$ de horas. Salsa al Parque ha pronosticado la audiencia $a_{it}$ que tendría cada uno de los artistas $i\\in A$ en caso de presentarse en cada hora $t \\in T$. Además, el comité estableció la duración $d_{i}$ (horas) que debe tener la presentación de cada uno de estos artistas $i\\in A$. Para generar la planeación se definió la variable binaria $x_{it}$ la cual toma el valor de uno si el artista $i \\in A$ inicia la presentación en la hora $t \\in H$ y cero de lo contrario. También, se decidió sobre la variable $y_{it}$, la cual toma el valor de uno si el artista $i \\in A$ se presenta durante la hora $t \\in H$ y cero de lo contrario." ] }, { "cell_type": "markdown", "id": "fb8be63d", "metadata": {}, "source": [ "Debido a la importancia de cada uno de estos artistas, el comité enfatizó que todos los artistas se deben presentar una sola vez y que en cada hora se pueden presentar máximo dos artistas en simultaneo. Con el fin de propiciar presentaciones de calidad, el comité organizador te solicitó garantizar que cada artista realiza su presentación completa en horas consecutivas. El comité ha pedido definir las horas en las que se presentará cada artista de manera que se maximice la audiencia total. La Tabla 1 presenta la duración de la presentación y la audiencia esperada en cada hora para cada uno de los artistas." ] }, { "cell_type": "markdown", "id": "9d1b2564", "metadata": {}, "source": [ "

Tabla 1. Audiencia esperada para cada artista en cada horario

" ] }, { "cell_type": "markdown", "id": "0c1715e9", "metadata": {}, "source": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
Audiencia (miles de personas)
Hora
ArtistaDuración Presentación (horas)123456789101112
12119725781350272926792946156329982879112625591129
23103420091515225416241277201025631384269520532585
32105818421443199528191998140117081346167418161032
43108212062366101327621479249615091673135011282669
52280110032965229511472156105828571968276421531518
" ] }, { "cell_type": "markdown", "id": "9061e7aa", "metadata": {}, "source": [ "La siguiente tabla presenta una solución factible, aunque subóptima, para la situación planteada anteriormente:" ] }, { "cell_type": "markdown", "id": "081012c1", "metadata": {}, "source": [ "

Tabla 1. Configuración factible de los itinerarios.

" ] }, { "cell_type": "markdown", "id": "af90e97a", "metadata": {}, "source": [ "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
Hora
Artista123456789101112
1
2
3
4
5
" ] }, { "cell_type": "markdown", "id": "linear-shadow", "metadata": {}, "source": [ "## Formulación\n", "\n", "" ] }, { "cell_type": "markdown", "id": "f08dc1b9", "metadata": {}, "source": [ "**a.** Formula matemáticamente un modelo de optimización de forma general que represente la\n", "situación anterior. Defina clara y rigurosamente: \n", "- Conjuntos\n", "- Parámetros\n", "- Variables de decisión\n", "- Restricciones\n", "- Naturaleza de las variables\n", "- Función objetivo" ] }, { "cell_type": "markdown", "id": "0c1bf4f5", "metadata": {}, "source": [ "### Conjuntos" ] }, { "cell_type": "markdown", "id": "00d69792", "metadata": {}, "source": [ "* $A$: artistas\n", "* $H$: horas" ] }, { "cell_type": "markdown", "id": "d480aa18", "metadata": {}, "source": [ "### Parámetros" ] }, { "cell_type": "markdown", "id": "87b6b55e", "metadata": {}, "source": [ "* $d_{i}$: duración de la presentación del artista $i\\in A$\n", "* $a_{it}$: audiencia del artista $i\\in A$ durante la hora $t\\in H$" ] }, { "cell_type": "markdown", "id": "ababdcab", "metadata": {}, "source": [ "### Variables de decisión" ] }, { "cell_type": "markdown", "id": "6c365f2a", "metadata": {}, "source": [ "* $x_{it}:\\begin{cases}1\\text{,}&\\text{ si el artista }i\\in A\\text{ inicia su presentación en la hora }t\\in H \\\\ 0\\text{,}& \\text{ d.l.c.} \\end{cases}$\n", "* $y_{it}:\\begin{cases}1\\text{,}&\\text{ si el artista }i\\in A\\text{ se presenta durante la hora }t\\in H \\\\ 0\\text{,}& \\text{ d.l.c.} \\end{cases}$" ] }, { "cell_type": "markdown", "id": "north-language", "metadata": {}, "source": [ "### Restricciones" ] }, { "cell_type": "markdown", "id": "7f295b86", "metadata": {}, "source": [ "Se garantiza que la cantidad de artistas presentandose en simultaneo a cada hora $h \\in H$ sea menor o igual a $k$:" ] }, { "cell_type": "markdown", "id": "bc5b5764", "metadata": {}, "source": [ "$$\n", " \\sum_{i \\in A}y_{i,t} \\leq k,\\ \\forall t \\in H;\n", "$$" ] }, { "cell_type": "markdown", "id": "dd23e0d4", "metadata": {}, "source": [ "Se garantiza que cada artista $i \\in A$ inicie su presentación una única vez:" ] }, { "cell_type": "markdown", "id": "386f40a4", "metadata": {}, "source": [ "$$\n", " \\sum_{t \\in H}x_{i,t} = 1,\\ \\forall i \\in A;\n", "$$" ] }, { "cell_type": "markdown", "id": "05537834", "metadata": {}, "source": [ "Se garantiza que cada artista $i \\in A$ se presenta en horas consecutivas y no presenta durante horas previas a la hora de inicio." ] }, { "cell_type": "markdown", "id": "2d87f083", "metadata": {}, "source": [ "- El artista $i \\in A$ se presenta en horas consecutivas desde el inicio de su presentación:" ] }, { "cell_type": "markdown", "id": "0f6b8502", "metadata": {}, "source": [ "$$\n", " \\sum_{j = t}^{t+d_{i}-1}y_{i,j} \\geq d_{i}x_{i,t},\\ \\forall i \\in A, t \\in H \\ \\vert\\ t + d(i) - 1 \\leq |H|;\n", "$$" ] }, { "cell_type": "markdown", "id": "f947e8dc", "metadata": {}, "source": [ "- El artista $i \\in A$ se presenta exactamente las horas que dura su presentación:" ] }, { "cell_type": "markdown", "id": "67a0ac83", "metadata": {}, "source": [ "$$\n", " \\sum_{t \\in H}y_{i,t} = d_{i},\\ \\forall i \\in A;\n", "$$" ] }, { "cell_type": "markdown", "id": "7b4ce993", "metadata": {}, "source": [ "- El artista $i \\in A$ no puede iniciar su presentación si el tiempo restante es insuficiente:" ] }, { "cell_type": "markdown", "id": "9bb0fbe3", "metadata": {}, "source": [ "$$\n", " x_{i,t} = 0,\\ \\forall i \\in A, t \\in H \\ \\vert \\ t + d_{i} - 1 > |H|;\n", "$$" ] }, { "cell_type": "markdown", "id": "descending-testament", "metadata": {}, "source": [ "### Naturaleza de las Variables" ] }, { "cell_type": "markdown", "id": "cc592cc3", "metadata": {}, "source": [ "En cualquier instante $t \\in H$ un artista $i\\in A$ puede o no iniciar su presentación y puede o no estarse presentando." ] }, { "cell_type": "markdown", "id": "99bac883", "metadata": {}, "source": [ "$$\n", " x_{it}, y_{it} \\in \\{0,1\\},\\ \\forall i \\in A, t \\in H;\n", "$$" ] }, { "cell_type": "markdown", "id": "voluntary-couple", "metadata": {}, "source": [ "### Función objetivo" ] }, { "cell_type": "markdown", "id": "5d8b38f1", "metadata": {}, "source": [ "Se debe maximizar la audiencia total alcanzada." ] }, { "cell_type": "markdown", "id": "47089664", "metadata": {}, "source": [ "$$\n", " \\operatorname{máx}\\ \\sum_{i \\in A} \\sum_{t \\in H} a_{it}y_{it}\n", "$$" ] }, { "cell_type": "markdown", "id": "geographic-header", "metadata": {}, "source": [ "## Implementación" ] }, { "cell_type": "markdown", "id": "4725d708", "metadata": {}, "source": [ "**b.** Resuelve el modelo planteado utilizando la librería de PuLP en Python. ¿Cuál es la solución óptima del problema? " ] }, { "cell_type": "markdown", "id": "2a1a82c3", "metadata": {}, "source": [ "### Librerías" ] }, { "cell_type": "markdown", "id": "f597d592", "metadata": {}, "source": [ "Importa el módulo `matplotlib.pyplot` para crear gráficas y la librería `pulp` para crear y resolver el modelo." ] }, { "cell_type": "code", "execution_count": 17, "id": "323a0476", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pulp as lp" ] }, { "cell_type": "markdown", "id": "837873b4", "metadata": {}, "source": [ "### Conjuntos" ] }, { "cell_type": "markdown", "id": "48fddac0", "metadata": {}, "source": [ "Define los conjuntos `A` y `H` que representan respectivamente los artistas y las horas.\n", "\n", "Recuerda que por conveniencia de preservar el orden de los elementos de los conjuntos, no siempre deberás definirlos con el tipo `set`." ] }, { "cell_type": "code", "execution_count": 3, "id": "d9209bb7", "metadata": {}, "outputs": [], "source": [ "# Artistas\n", "A = [f\"A_{i}\" for i in range(1, 6)]\n", "\n", "# Horas\n", "H = list(range(1, 13))" ] }, { "cell_type": "markdown", "id": "8c58ff99", "metadata": {}, "source": [ "### Parámetros" ] }, { "cell_type": "markdown", "id": "d981d80d", "metadata": {}, "source": [ "Define o importa los parámetros del modelo." ] }, { "cell_type": "code", "execution_count": 4, "id": "16df6fb4", "metadata": {}, "outputs": [], "source": [ "# Duración de la presentación de cada artista\n", "d = {\"A_1\": 2, \"A_2\": 3, \"A_3\": 2, \"A_4\": 3, \"A_5\": 2}\n", "\n", "# Audiencia de cada artista en cada hora\n", "a = {\n", " (\"A_1\", 1): 1197,\n", " (\"A_1\", 2): 2578,\n", " (\"A_1\", 3): 1350,\n", " (\"A_1\", 4): 2729,\n", " (\"A_1\", 5): 2679,\n", " (\"A_1\", 6): 2946,\n", " (\"A_1\", 7): 1563,\n", " (\"A_1\", 8): 2998,\n", " (\"A_1\", 9): 2879,\n", " (\"A_1\", 10): 1126,\n", " (\"A_1\", 11): 2559,\n", " (\"A_1\", 12): 1129,\n", " (\"A_2\", 1): 1034,\n", " (\"A_2\", 2): 2009,\n", " (\"A_2\", 3): 1515,\n", " (\"A_2\", 4): 2254,\n", " (\"A_2\", 5): 1624,\n", " (\"A_2\", 6): 1277,\n", " (\"A_2\", 7): 2010,\n", " (\"A_2\", 8): 2563,\n", " (\"A_2\", 9): 1384,\n", " (\"A_2\", 10): 2695,\n", " (\"A_2\", 11): 2053,\n", " (\"A_2\", 12): 2585,\n", " (\"A_3\", 1): 1058,\n", " (\"A_3\", 2): 1842,\n", " (\"A_3\", 3): 1443,\n", " (\"A_3\", 4): 1995,\n", " (\"A_3\", 5): 2819,\n", " (\"A_3\", 6): 1998,\n", " (\"A_3\", 7): 1401,\n", " (\"A_3\", 8): 1708,\n", " (\"A_3\", 9): 1346,\n", " (\"A_3\", 10): 1674,\n", " (\"A_3\", 11): 1816,\n", " (\"A_3\", 12): 1032,\n", " (\"A_4\", 1): 1082,\n", " (\"A_4\", 2): 1206,\n", " (\"A_4\", 3): 2366,\n", " (\"A_4\", 4): 1013,\n", " (\"A_4\", 5): 2762,\n", " (\"A_4\", 6): 1479,\n", " (\"A_4\", 7): 2496,\n", " (\"A_4\", 8): 1509,\n", " (\"A_4\", 9): 1673,\n", " (\"A_4\", 10): 1350,\n", " (\"A_4\", 11): 1128,\n", " (\"A_4\", 12): 2669,\n", " (\"A_5\", 1): 2801,\n", " (\"A_5\", 2): 1003,\n", " (\"A_5\", 3): 2965,\n", " (\"A_5\", 4): 2295,\n", " (\"A_5\", 5): 1147,\n", " (\"A_5\", 6): 2156,\n", " (\"A_5\", 7): 1058,\n", " (\"A_5\", 8): 2857,\n", " (\"A_5\", 9): 1968,\n", " (\"A_5\", 10): 2764,\n", " (\"A_5\", 11): 2153,\n", " (\"A_5\", 12): 1518,\n", "}\n", "\n", "# Máxima cantidad de artistas presentando en simultaneo\n", "k = 2" ] }, { "cell_type": "markdown", "id": "70fd6598", "metadata": {}, "source": [ "### Objeto del modelo" ] }, { "cell_type": "markdown", "id": "aa975e80", "metadata": {}, "source": [ "Construye un problema al que luego agregarás las restricciones y la función objetivo." ] }, { "cell_type": "code", "execution_count": 5, "id": "a1501b81", "metadata": {}, "outputs": [], "source": [ "problema = lp.LpProblem(name=\"scheduling-salsa-al-parque\", sense=lp.LpMaximize)" ] }, { "cell_type": "markdown", "id": "970af788", "metadata": {}, "source": [ "### Variables de decisión" ] }, { "cell_type": "markdown", "id": "1e670ec8", "metadata": {}, "source": [ "Define las variables del problema de manera que estén contenidas en diccionarios indexados en los conjuntos de sus variables respectivas." ] }, { "cell_type": "code", "execution_count": 6, "id": "e1febe93", "metadata": {}, "outputs": [], "source": [ "# Si el artista a en A inicia su presentación en t en H\n", "x = {\n", " (i, t): lp.LpVariable(\n", " name=f\"inicia_{i}_en_hora_{t}\", lowBound=0, upBound=None, cat=lp.LpBinary\n", " )\n", " for i in A\n", " for t in H\n", "}\n", "\n", "# Si el artista a en A se presenta durante la hora t in H\n", "y = {\n", " (i, t): lp.LpVariable(\n", " name=f\"presenta_{i}_en_hora_{t}\", lowBound=0, upBound=None, cat=lp.LpBinary\n", " )\n", " for i in A\n", " for t in H\n", "}" ] }, { "cell_type": "markdown", "id": "f843462c", "metadata": {}, "source": [ "### Función objetivo" ] }, { "cell_type": "markdown", "id": "97df9059", "metadata": {}, "source": [ "Agrega al problema la función objetivo. Recuerda que al definir el problema, ya definiste si este es de maximización o minimización." ] }, { "cell_type": "code", "execution_count": 7, "id": "2fd8a365", "metadata": {}, "outputs": [], "source": [ "problema += sum(a[i, t] * y[i, t] for i in A for t in H), \"audiencia_total\"" ] }, { "cell_type": "markdown", "id": "89f524db", "metadata": {}, "source": [ "### Restricciones" ] }, { "cell_type": "markdown", "id": "77e7e409", "metadata": {}, "source": [ "Agrega al problema las restricciones del modelo." ] }, { "cell_type": "code", "execution_count": 8, "id": "f986d5ee", "metadata": {}, "outputs": [], "source": [ "# Los artistas presentandose durante h en H son menos que k\n", "for t in H:\n", " problema += sum(y[(i, t)] for i in A) <= k\n", "\n", "# Cada artista i en A inicia su presentación una única vez\n", "for i in A:\n", " problema += sum(x[(i, t)] for t in H) == 1\n", "\n", "# Cada artista se presenta en horas consecutivas luego de su inicio\n", "for i in A:\n", " for t in H:\n", " if t + d[i] - 1 <= max(H):\n", " problema += sum(y[i, j] for j in range(t, t + d[i])) >= d[i] * x[i, t]\n", "\n", "# cada artista debe presentarse exactamente la cantidad de horas que le corresponden\n", "for i in A:\n", " problema += sum(y[i, t] for t in H) == d[i]\n", "\n", "# Cada artista no puede iniciar su presentación si el tiempo es insuficiente\n", "for i in A:\n", " for t in H:\n", " if t + d[i] - 1 > max(H):\n", " problema += x[i, t] == 0" ] }, { "cell_type": "markdown", "id": "265a2a10", "metadata": {}, "source": [ "### Resolver el problema" ] }, { "cell_type": "markdown", "id": "d7661201", "metadata": {}, "source": [ "Invoca el optimizador. Este paso le asigna un valor a las variables incluidas en las restricciones o función objetivo del modelo." ] }, { "cell_type": "code", "execution_count": 9, "id": "ae811704", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Welcome to the CBC MILP Solver \n", "Version: 2.10.8 \n", "Build Date: May 6 2022 \n", "\n", "command line - cbc /tmp/7d34ed252fae452a9efc83a95cb59077-pulp.mps max timeMode elapsed branch printingOptions all solution /tmp/7d34ed252fae452a9efc83a95cb59077-pulp.sol (default strategy 1)\n", "At line 2 NAME MODEL\n", "At line 3 ROWS\n", "At line 87 COLUMNS\n", "At line 754 RHS\n", "At line 837 BOUNDS\n", "At line 958 ENDATA\n", "Problem MODEL has 82 rows, 120 columns and 366 elements\n", "Coin0008I MODEL read with 0 errors\n", "Option for timeMode changed from cpu to elapsed\n", "Continuous objective value is 32297 - 0.00 seconds\n", "Cgl0002I 7 variables fixed\n", "Cgl0003I 0 fixed, 0 tightened bounds, 53 strengthened rows, 0 substitutions\n", "Cgl0003I 0 fixed, 0 tightened bounds, 47 strengthened rows, 0 substitutions\n", "Cgl0003I 0 fixed, 0 tightened bounds, 16 strengthened rows, 0 substitutions\n", "Cgl0003I 0 fixed, 0 tightened bounds, 12 strengthened rows, 0 substitutions\n", "Cgl0004I processed model has 75 rows, 113 columns (113 integer (113 of which binary)) and 480 elements\n", "Cbc0038I Initial state - 5 integers unsatisfied sum - 2\n", "Cbc0038I Pass 1: suminf. 0.00000 (0) obj. -29428 iterations 38\n", "Cbc0038I Solution found of -29428\n", "Cbc0038I Before mini branch and bound, 107 integers at bound fixed and 0 continuous\n", "Cbc0038I Full problem 75 rows 113 columns, reduced to 0 rows 0 columns\n", "Cbc0038I Mini branch and bound did not improve solution (0.01 seconds)\n", "Cbc0038I Round again with cutoff of -29525.5\n", "Cbc0038I Reduced cost fixing fixed 18 variables on major pass 2\n", "Cbc0038I Pass 2: suminf. 1.66667 (5) obj. -29904 iterations 8\n", "Cbc0038I Pass 3: suminf. 1.66667 (5) obj. -29904 iterations 5\n", "Cbc0038I Pass 4: suminf. 1.66667 (5) obj. -29904 iterations 4\n", "Cbc0038I Pass 5: suminf. 2.14888 (10) obj. -29525.5 iterations 32\n", "Cbc0038I Pass 6: suminf. 0.00000 (0) obj. -29681 iterations 19\n", "Cbc0038I Solution found of -29681\n", "Cbc0038I Before mini branch and bound, 92 integers at bound fixed and 0 continuous\n", "Cbc0038I Full problem 75 rows 113 columns, reduced to 7 rows 5 columns\n", "Cbc0038I Mini branch and bound improved solution from -29681 to -30024 (0.02 seconds)\n", "Cbc0038I Round again with cutoff of -30099.7\n", "Cbc0038I Reduced cost fixing fixed 42 variables on major pass 3\n", "Cbc0038I Pass 7: suminf. 2.00000 (6) obj. -30155.8 iterations 1\n", "Cbc0038I Pass 8: suminf. 1.66667 (5) obj. -30144.3 iterations 7\n", "Cbc0038I Pass 9: suminf. 1.66667 (5) obj. -30144.3 iterations 2\n", "Cbc0038I Pass 10: suminf. 1.90453 (9) obj. -30099.7 iterations 5\n", "Cbc0038I Pass 11: suminf. 3.90354 (14) obj. -30099.7 iterations 33\n", "Cbc0038I Pass 12: suminf. 2.00000 (8) obj. -30099.7 iterations 23\n", "Cbc0038I Pass 13: suminf. 1.66667 (5) obj. -30099.7 iterations 5\n", "Cbc0038I Pass 14: suminf. 2.17745 (9) obj. -30099.7 iterations 8\n", "Cbc0038I Pass 15: suminf. 1.99482 (9) obj. -30099.7 iterations 11\n", "Cbc0038I Pass 16: suminf. 2.00000 (8) obj. -30099.7 iterations 3\n", "Cbc0038I Pass 17: suminf. 3.53805 (13) obj. -30099.7 iterations 14\n", "Cbc0038I Pass 18: suminf. 2.00000 (8) obj. -30293.7 iterations 11\n", "Cbc0038I Pass 19: suminf. 2.00000 (8) obj. -30293.7 iterations 1\n", "Cbc0038I Pass 20: suminf. 2.22092 (9) obj. -30099.7 iterations 4\n", "Cbc0038I Pass 21: suminf. 1.99482 (9) obj. -30099.7 iterations 1\n", "Cbc0038I Pass 22: suminf. 2.00000 (8) obj. -30099.7 iterations 3\n", "Cbc0038I Pass 23: suminf. 2.00000 (8) obj. -30099.7 iterations 4\n", "Cbc0038I Pass 24: suminf. 1.66667 (5) obj. -30099.7 iterations 5\n", "Cbc0038I Pass 25: suminf. 1.66667 (5) obj. -30144.3 iterations 3\n", "Cbc0038I Pass 26: suminf. 1.90453 (9) obj. -30099.7 iterations 6\n", "Cbc0038I Pass 27: suminf. 1.66667 (5) obj. -30144.3 iterations 16\n", "Cbc0038I Pass 28: suminf. 4.00000 (11) obj. -30099.7 iterations 30\n", "Cbc0038I Pass 29: suminf. 3.48328 (10) obj. -30099.7 iterations 8\n", "Cbc0038I Pass 30: suminf. 3.48328 (10) obj. -30099.7 iterations 4\n", "Cbc0038I Pass 31: suminf. 3.48328 (10) obj. -30099.7 iterations 3\n", "Cbc0038I Pass 32: suminf. 2.00000 (6) obj. -30155.8 iterations 17\n", "Cbc0038I Pass 33: suminf. 2.00000 (6) obj. -30155.8 iterations 9\n", "Cbc0038I Pass 34: suminf. 1.66667 (5) obj. -30144.3 iterations 4\n", "Cbc0038I Pass 35: suminf. 1.66667 (5) obj. -30144.3 iterations 3\n", "Cbc0038I Pass 36: suminf. 1.90453 (9) obj. -30099.7 iterations 4\n", "Cbc0038I No solution found this major pass\n", "Cbc0038I Before mini branch and bound, 87 integers at bound fixed and 0 continuous\n", "Cbc0038I Mini branch and bound did not improve solution (0.03 seconds)\n", "Cbc0038I After 0.03 seconds - Feasibility pump exiting with objective of -30024 - took 0.04 seconds\n", "Cbc0012I Integer solution of -30024 found by feasibility pump after 0 iterations and 0 nodes (0.03 seconds)\n", "Cbc0038I Full problem 75 rows 113 columns, reduced to 0 rows 0 columns\n", "Cbc0001I Search completed - best objective -30024, took 1 iterations and 0 nodes (0.03 seconds)\n", "Cbc0035I Maximum depth 0, 38 variables fixed on reduced cost\n", "Cuts at root node changed objective from -30402.5 to -28393.3\n", "Probing was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "Gomory was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "Knapsack was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "Clique was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "MixedIntegerRounding2 was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "FlowCover was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "TwoMirCuts was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "ZeroHalf was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)\n", "\n", "Result - Optimal solution found\n", "\n", "Objective value: 30024.00000000\n", "Enumerated nodes: 0\n", "Total iterations: 1\n", "Time (CPU seconds): 0.06\n", "Time (Wallclock seconds): 0.04\n", "\n", "Option for printingOptions changed from normal to all\n", "Total time (CPU seconds): 0.06 (Wallclock seconds): 0.04\n", "\n" ] }, { "data": { "text/plain": [ "1" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problema.solve()" ] }, { "cell_type": "markdown", "id": "655b238a", "metadata": {}, "source": [ "### Imprimir resultados" ] }, { "cell_type": "markdown", "id": "8a7a8a35", "metadata": {}, "source": [ "Antes de estudiar el óptimo del modelo, identifica en el estado del optimizador si pudo resolver el problema." ] }, { "cell_type": "code", "execution_count": 10, "id": "whole-trust", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Estado del optimizador: Optimal'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f\"Estado del optimizador: {lp.LpStatus[problema.status]}\"" ] }, { "cell_type": "markdown", "id": "ea6fe01e", "metadata": {}, "source": [ "Identifica también el valor de la función objetivo." ] }, { "cell_type": "code", "execution_count": 11, "id": "11b75d2c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Audiencia alcanzada: 30024000.0'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f\"Audiencia alcanzada: {lp.value(problema.objective) * 1000}\"" ] }, { "cell_type": "markdown", "id": "6e59d608", "metadata": {}, "source": [ "Por último, imprime de manera estructurada el valor de las variables de decisión y otras expresiones de interés." ] }, { "cell_type": "code", "execution_count": 14, "id": "ad53e1be", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\n", "A_1\t 0\t 0\t 0\t 0\t 0\t 0\t 0\t 1\t 1\t 0\t 0\t 0\n", "A_2\t 0\t 0\t 0\t 0\t 0\t 0\t 0\t 0\t 0\t 1\t 1\t 1\n", "A_3\t 0\t 0\t 0\t 0\t 1\t 1\t 0\t 0\t 0\t 0\t 0\t 0\n", "A_4\t 0\t 0\t 0\t 0\t 1\t 1\t 1\t 0\t 0\t 0\t 0\t 0\n", "A_5\t 0\t 0\t 1\t 1\t 0\t 0\t 0\t 0\t 0\t 0\t 0\t 0\n" ] } ], "source": [ "for t in H:\n", " print(f\"\\t{t}\", end=\"\")\n", "print()\n", "\n", "for i in A:\n", " print(i, end=\"\")\n", " for t in H:\n", " print(f\"\\t{lp.value(y[i, t]): .0f}\", end=\"\")\n", " print()" ] }, { "cell_type": "markdown", "id": "1b31089f", "metadata": {}, "source": [ "### Visualizar resultados" ] }, { "cell_type": "markdown", "id": "8f832f83", "metadata": {}, "source": [ "Ahora que conoces el valor de las variables de decisión, desarrolla una gráfica..." ] }, { "cell_type": "code", "execution_count": 19, "id": "727798d1", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj8AAAHFCAYAAAAdTZjVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2UklEQVR4nO3deXxNd+L/8fdtEleEXLFEhEhqi10ZBtWpsZSoWqZ2zZTSdrSYaquLXTNFy1eXaYuvimQURVvtkOmGqqlhiBJV+tN2qpYSlEgi1ZDk8/vDN3d6JSFXE+fGeT0fj/N49J57zue879Lct7Pc6zDGGAEAANjETVYHAAAAuJ4oPwAAwFYoPwAAwFYoPwAAwFYoPwAAwFYoPwAAwFYoPwAAwFYoPwAAwFYoPwAAwFYoP8BlEhMT5XA4tHPnTve8999/XzNmzCh0+aioKI0YMeL6hCsl+Y/5+++/L1Pb+fTTT+VwONyTn5+fatSooYEDB+qrr74qkW1Y6dixY5oxY4ZSUlJKdTvff/+9HA6HEhMTS3U7gK/wtzoAUBa8//77eu211wotQO+++66Cg4Ovf6gS1KtXL23btk01a9a0Oso1mTVrljp37qwLFy5o586diouL08aNG7V3717VqlXL6njX7NixY3rmmWcUFRWlW265pdS2U7NmTW3btk316tUrtW0AvoTyA/xKrVq1smS7P/30kypUqPCrxjh//rzKly+v6tWrq3r16iWU7Ppr0KCB2rdvL0m6/fbbVblyZY0aNUqJiYmaPHlyoeuUxPN3o3A6ne7nD7ADDnsBVzFixAi99tprkuRxiCX/0M3lh73yD8W8+eabmjx5ssLDwxUcHKxu3brpwIEDBcbfsGGDunbtquDgYFWoUEEdO3bUxo0bPZaZMWOGHA6Hdu3apQEDBigkJMT9r/SdO3dqyJAhioqKUmBgoKKiojR06FAdOnTIY4z8Q04ff/yxRo4cqerVq6tChQrKzs4u8nDUkiVL1LJlS5UvX15VqlTRH/7wh2IfTvr3v/+tjh07qnz58goPD9fEiRN18eLFQpddtWqVOnTooKCgIFWsWFE9evTQ7t27i7WdwuR/kOc/B1d6/owxmj9/vm655RYFBgYqJCREAwYM0Hfffecx5u7du3XXXXcpNDRUTqdT4eHh6tWrl44ePepeprhj/f73v1ezZs2UnJys3/3ud6pQoYLq1q2r5557Tnl5eZIuvY/atm0rSbrvvvvc77v8vY/Ffd0l6YcfftCDDz6oiIgIlStXTuHh4RowYIBOnDghqejDXlu2bFHXrl1VqVIlVahQQbfeeqv+8Y9/eCyT/97ZtGmTHnroIVWrVk1Vq1bV3XffrWPHjhXIUpzX+rvvvtOQIUMUHh4up9OpGjVqqGvXrqV++A/2QfkBrmLq1KkaMGCAJGnbtm3u6WqHiCZNmqRDhw5p8eLFWrRokb755hv17t1bubm57mWWLVum7t27Kzg4WH/729+0evVqValSRT169ChQgCTp7rvvVv369fXWW29p4cKFki59cEVHR+ull17SRx99pOeff17Hjx9X27Zt9eOPPxYYY+TIkQoICNAbb7yht99+WwEBAYXmnz17tkaNGqWmTZtqzZo1evnll/XFF1+oQ4cO+uabb6742Pfv36+uXbvq7NmzSkxM1MKFC7V79249++yzBZadNWuWhg4dqiZNmmj16tV64403lJmZqd/97nfav3//FbdTlG+//VaSCuzNKuz5+9Of/qTx48erW7dueu+99zR//nzt27dPt956q7scZGVl6Y477tCJEyf02muvaf369XrppZdUp04dZWZmuscvzlj5UlNTdc899yg2NlZr165Vz549NXHiRC1btkyS1Lp1ayUkJEiSpkyZ4n7f3X///ZKK/7r/8MMPatu2rd5991099thj+uCDD/TSSy/J5XIpLS2tyOdw8+bN6tKli9LT0xUfH68333xTlSpVUu/evbVq1aoCy99///0KCAjQihUrNGfOHH366aeKjY31WKa4r/Wdd96pzz//XHPmzNH69eu1YMECtWrVSmfPni0yL+AVA8BDQkKCkWSSk5Pd88aMGWOK+t8lMjLSDB8+3H1706ZNRpK58847PZZbvXq1kWS2bdtmjDEmKyvLVKlSxfTu3dtjudzcXNOyZUvz29/+1j1v+vTpRpKZNm3aVfPn5OSYc+fOmaCgIPPyyy8XeFz33ntvkY/54MGDxhhj0tLSTGBgYIHHcPjwYeN0Os2wYcOumGHw4MEmMDDQpKameuRq1KiRx3YOHz5s/P39zbhx4zzWz8zMNGFhYWbQoEFX3E7+c71q1Spz8eJF89NPP5l//vOfpn79+sbPz8/s2bPHGFP087dt2zYjycybN89j/pEjR0xgYKB58skn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K1euVK1atZSXl6f169crMzOzNHMCAACUCK+v9qpQoYJGjhypLVu2aO/evXr88cf13HPPKTQ0VH369CmNjAAAACXmmi91l6To6GjNmTNHR48e1ZtvvllSmQAAAEqN119yWBg/Pz/169dP/fr1K4nhAEgKDXaqaXiw1THKvNBgp9URAPgYhzHGWB3CShkZGXK5XEpPT1dwMB80AACUBb/m8/tXHfYCAAAoayg/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVig/AADAVvytDgAAwK+1fPshrdh+2OoYKGXD2tXRPe0if/U4lB8AQJl3MiNb+45lWB0DpexkRnaJjMNhLwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCuUHwAAYCs+UX62bt0qPz8/xcTEFHudPXv2aOjQoYqIiFBgYKAaN26sl19+uRRTAgCAG4G/1QEkacmSJRo3bpwWL16sw4cPq06dOldd5/PPP1f16tW1bNkyRUREaOvWrXrwwQfl5+ensWPHXofUAACgLLK8/GRlZWn16tVKTk5WamqqEhMTNW3atKuuN3LkSI/bdevW1bZt27RmzRrKDwAAKJLlh71WrVql6OhoRUdHKzY2VgkJCTLGXNNY6enpqlKlyhWXyc7OVkZGhscEAADsw/LyEx8fr9jYWElSTEyMzp07p40bN3o9zrZt27R69Wr96U9/uuJys2fPlsvlck8RERHXlBsAAJRNlpafAwcOaMeOHRoyZIgkyd/fX4MHD9aSJUu8Gmffvn3q27evpk2bpjvuuOOKy06cOFHp6enu6ciRI9ecHwAAlD2WnvMTHx+vnJwc1apVyz3PGKOAgAClpaUpJCTkqmPs379fXbp00QMPPKApU6ZcdXmn0ymn0/mrcgMAgLLLsj0/OTk5Wrp0qebNm6eUlBT3tGfPHkVGRmr58uVXHWPfvn3q3Lmzhg8frpkzZ16H1AAAoKyzbM9PUlKS0tLSNGrUKLlcLo/7BgwYoPj4+CtetZVffLp3767HHntMqampkiQ/Pz9Vr169VLMDAICyy7I9P/Hx8erWrVuB4iNJ/fv3V0pKinbt2lXk+m+99ZZOnTql5cuXq2bNmu6pbdu2pRkbAACUcZbt+Vm3bl2R97Vu3fqql7vPmDFDM2bMKOFUAADgRmf5pe4AAADXk8+Wn9GjR6tixYqFTqNHj7Y6HgAAKKMs/3mLosTFxWnChAmF3hccHHyd0wAAgBuFz5af0NBQhYaGWh0DAADcYHz2sBcAAEBpoPwAAABbofwAAABbofwAAABbofwAAABbofwAAABbofwAAABbofwAAABbofwAAABbofwAAABbofwAAABbofwAAABbofwAAABb8dlfdQcAoLhCg51qGh5sdQyUstBgZ4mM4zDGmBIZqYzKyMiQy+VSenq6goP5HwcAgLLg13x+c9gLAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYCuUHAADYir/VAQDAzpZvP6QV2w9bHaPMG9auju5pF2l1DJQRlB8AsNDJjGztO5ZhdYwy72RGttURUIZw2AsAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANiKT5SfrVu3ys/PTzExMV6t98gjj+g3v/mNnE6nbrnlltIJBwAAbig+UX6WLFmicePGacuWLTp8+HCx1zPGaOTIkRo8eHAppgMAADcSf6sDZGVlafXq1UpOTlZqaqoSExM1bdq0Yq3717/+VZJ06tQpffHFF6UZEwAA3CAs3/OzatUqRUdHKzo6WrGxsUpISJAxptS2l52drYyMDI8JAADYh+XlJz4+XrGxsZKkmJgYnTt3Ths3biy17c2ePVsul8s9RURElNq2AACA77G0/Bw4cEA7duzQkCFDJEn+/v4aPHiwlixZUmrbnDhxotLT093TkSNHSm1bAADA91h6zk98fLxycnJUq1Yt9zxjjAICApSWlqaQkJAS36bT6ZTT6SzxcQEAQNlg2Z6fnJwcLV26VPPmzVNKSop72rNnjyIjI7V8+XKrogEAgBuYZXt+kpKSlJaWplGjRsnlcnncN2DAAMXHx2vs2LFXHOPbb7/VuXPnlJqaqvPnzyslJUWS1KRJE5UrV660ogMAgDLMsvITHx+vbt26FSg+ktS/f3/NmjVLu3btUuvWrYsc4/7779fmzZvdt1u1aiVJOnjwoKKioko8MwAAKPssKz/r1q0r8r7WrVsX63L3Tz/9tAQTAQAAO7D8UncAAIDryWfLz+jRo1WxYsVCp9GjR1sdDwAAlFGW/7xFUeLi4jRhwoRC7wsODr7OaQAAwI3CZ8tPaGioQkNDrY4BAABuMD572AsAAKA0UH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICtUH4AAICt+OyvugOAHYQGO9U0PNjqGGVeaLDT6ggoQxzGGGN1CCtlZGTI5XIpPT1dwcH8AQIAoCz4NZ/fHPYCAAC2QvkBAAC2QvkBAAC2QvkBAAC2YvurvfLP987IyLA4CQAAKK78z+1ruW7L9uUnMzNTkhQREWFxEgAA4K3MzEy5XC6v1rH9pe55eXk6duyYKlWqJIfDoYyMDEVEROjIkSM+eem7r+eTyFgSfD2fRMaS4Ov5JDKWBF/PJ5XNjMYYZWZmKjw8XDfd5N1ZPLbf83PTTTepdu3aBeYHBwf77BtA8v18EhlLgq/nk8hYEnw9n0TGkuDr+aSyl9HbPT75OOEZAADYCuUHAADYCuXnMk6nU9OnT5fT6Zu/E+Pr+SQylgRfzyeRsST4ej6JjCXB1/NJ9sto+xOeAQCAvbDnBwAA2ArlBwAA2ArlBwAA2ArlBwAA2Arl5//885//VO/evRUeHi6Hw6H33nvP6kgeZs+erbZt26pSpUoKDQ1Vv379dODAAatjeViwYIFatGjh/gKqDh066IMPPrA6VpFmz54th8Oh8ePHWx3FbcaMGXI4HB5TWFiY1bEK+OGHHxQbG6uqVauqQoUKuuWWW/T5559bHUuSFBUVVeA5dDgcGjNmjNXR3HJycjRlyhTdfPPNCgwMVN26dRUXF6e8vDyro7llZmZq/PjxioyMVGBgoG699VYlJydbludqf6ONMZoxY4bCw8MVGBio3//+99q3b59PZVyzZo169OihatWqyeFwKCUl5brmu1rGixcv6qmnnlLz5s0VFBSk8PBw3XvvvTp27JhP5JMu/Y1s1KiRgoKCFBISom7dumn79u1eb4fy83+ysrLUsmVLvfrqq1ZHKdTmzZs1ZswY/fvf/9b69euVk5Oj7t27Kysry+pobrVr19Zzzz2nnTt3aufOnerSpYv69u173f8AFUdycrIWLVqkFi1aWB2lgKZNm+r48ePuae/evVZH8pCWlqaOHTsqICBAH3zwgfbv36958+apcuXKVkeTdOm1/eXzt379eknSwIEDLU72X88//7wWLlyoV199VV999ZXmzJmjuXPn6pVXXrE6mtv999+v9evX64033tDevXvVvXt3devWTT/88IMlea72N3rOnDl64YUX9Oqrryo5OVlhYWG644473L/f6AsZs7Ky1LFjRz333HPXLVNhGYrK+NNPP2nXrl2aOnWqdu3apTVr1ujrr79Wnz59fCKfJDVs2FCvvvqq9u7dqy1btigqKkrdu3fXqVOnvNuQQQGSzLvvvmt1jCs6efKkkWQ2b95sdZQrCgkJMYsXL7Y6hofMzEzToEEDs379etOpUyfzyCOPWB3Jbfr06aZly5ZWx7iip556ytx2221Wxyi2Rx55xNSrV8/k5eVZHcWtV69eZuTIkR7z7r77bhMbG2tRIk8//fST8fPzM0lJSR7zW7ZsaSZPnmxRqv+6/G90Xl6eCQsLM88995x73s8//2xcLpdZuHChBQmv/Dly8OBBI8ns3r37uma6XHE+63bs2GEkmUOHDl2fUL9QnHzp6elGktmwYYNXY7Pnp4xKT0+XJFWpUsXiJIXLzc3VypUrlZWVpQ4dOlgdx8OYMWPUq1cvdevWzeoohfrmm28UHh6um2++WUOGDNF3331ndSQPa9euVZs2bTRw4ECFhoaqVatWev31162OVagLFy5o2bJlGjlypBwOh9Vx3G677TZt3LhRX3/9tSRpz5492rJli+68806Lk12Sk5Oj3NxclS9f3mN+YGCgtmzZYlGqoh08eFCpqanq3r27e57T6VSnTp20detWC5OVfenp6XI4HD6zZ/eXLly4oEWLFsnlcqlly5ZerWv7HzYti4wxeuyxx3TbbbepWbNmVsfxsHfvXnXo0EE///yzKlasqHfffVdNmjSxOpbbypUrtWvXLkvPXbiSdu3aaenSpWrYsKFOnDihZ599Vrfeeqv27dunqlWrWh1PkvTdd99pwYIFeuyxxzRp0iTt2LFDf/7zn+V0OnXvvfdaHc/De++9p7Nnz2rEiBFWR/Hw1FNPKT09XY0aNZKfn59yc3M1c+ZMDR061OpokqRKlSqpQ4cO+stf/qLGjRurRo0aevPNN7V9+3Y1aNDA6ngFpKamSpJq1KjhMb9GjRo6dOiQFZFuCD///LOefvppDRs2zKd+7DQpKUlDhgzRTz/9pJo1a2r9+vWqVq2aV2NQfsqgsWPH6osvvvDJf4FFR0crJSVFZ8+e1TvvvKPhw4dr8+bNPlGAjhw5okceeUQff/xxgX/R+oqePXu6/7t58+bq0KGD6tWrp7/97W967LHHLEz2X3l5eWrTpo1mzZolSWrVqpX27dunBQsW+Fz5iY+PV8+ePRUeHm51FA+rVq3SsmXLtGLFCjVt2lQpKSkaP368wsPDNXz4cKvjSZLeeOMNjRw5UrVq1ZKfn59at26tYcOGadeuXVZHK9Lle/eMMT61x68suXjxooYMGaK8vDzNnz/f6jgeOnfurJSUFP344496/fXXNWjQIG3fvl2hoaHFHoPDXmXMuHHjtHbtWm3atEm1a9e2Ok4B5cqVU/369dWmTRvNnj1bLVu21Msvv2x1LEnS559/rpMnT+o3v/mN/P395e/vr82bN+uvf/2r/P39lZuba3XEAoKCgtS8eXN98803Vkdxq1mzZoEy27hxYx0+fNiiRIU7dOiQNmzYoPvvv9/qKAU88cQTevrppzVkyBA1b95cf/zjH/Xoo49q9uzZVkdzq1evnjZv3qxz587pyJEj2rFjhy5evKibb77Z6mgF5F8Rmb8HKN/JkycL7A3C1V28eFGDBg3SwYMHtX79ep/a6yNd+rtYv359tW/fXvHx8fL391d8fLxXY1B+yghjjMaOHas1a9bok08+8ck/QIUxxig7O9vqGJKkrl27au/evUpJSXFPbdq00T333KOUlBT5+flZHbGA7OxsffXVV6pZs6bVUdw6duxY4GsWvv76a0VGRlqUqHAJCQkKDQ1Vr169rI5SwE8//aSbbvL88+vn5+dTl7rnCwoKUs2aNZWWlqaPPvpIffv2tTpSATfffLPCwsLcV/ZJl84H2bx5s2699VYLk5U9+cXnm2++0YYNG3zmcPuVXMvnDIe9/s+5c+f07bffum8fPHhQKSkpqlKliurUqWNhskvGjBmjFStW6O9//7sqVark/heOy+VSYGCgxekumTRpknr27KmIiAhlZmZq5cqV+vTTT/Xhhx9aHU3SpfMYLj9HKigoSFWrVvWZc6cmTJig3r17q06dOjp58qSeffZZZWRk+MyhEEl69NFHdeutt2rWrFkaNGiQduzYoUWLFmnRokVWR3PLy8tTQkKChg8fLn9/3/sz17t3b82cOVN16tRR06ZNtXv3br3wwgsaOXKk1dHcPvroIxljFB0drW+//VZPPPGEoqOjdd9991mS52p/o8ePH69Zs2apQYMGatCggWbNmqUKFSpo2LBhPpPxzJkzOnz4sPt7c/L/EREWFnbdvs/rShnDw8M1YMAA7dq1S0lJScrNzXV/1lSpUkXlypWzNF/VqlU1c+ZM9enTRzVr1tTp06c1f/58HT161Puvsrim689uQJs2bTKSCkzDhw+3OpoxxhSaTZJJSEiwOprbyJEjTWRkpClXrpypXr266dq1q/n444+tjnVFvnap++DBg03NmjVNQECACQ8PN3fffbfZt2+f1bEKWLdunWnWrJlxOp2mUaNGZtGiRVZH8vDRRx8ZSebAgQNWRylURkaGeeSRR0ydOnVM+fLlTd26dc3kyZNNdna21dHcVq1aZerWrWvKlStnwsLCzJgxY8zZs2cty3O1v9F5eXlm+vTpJiwszDidTnP77bebvXv3+lTGhISEQu+fPn26T2TMvwS/sGnTpk2W5zt//rz5wx/+YMLDw025cuVMzZo1TZ8+fcyOHTu83o7DGGO8q0sAAABlF+f8AAAAW6H8AAAAW6H8AAAAW6H8AAAAW6H8AAAAW6H8AAAAW6H8AAAAW6H8AAAAW6H8APBpI0aMUL9+/QrM//TTT+VwOHT27NnrnglA2Ub5AWBLFy5csDoCAItQfgDcEN555x01bdpUTqdTUVFRmjdvnsf9UVFRevbZZzVixAi5XC498MADkqSnnnpKDRs2VIUKFVS3bl1NnTpVFy9etOIhALhOfO/njgHAS59//rkGDRqkGTNmaPDgwdq6dasefvhhVa1aVSNGjHAvN3fuXE2dOlVTpkxxz6tUqZISExMVHh6uvXv36oEHHlClSpX05JNPWvBIAFwP/LApAJ82YsQILVu2TOXLl/eYn5ubq59//llpaWkaM2aMTp06pY8//th9/5NPPql//OMf2rdvn6RLe35atWqld99994rbmzt3rlatWqWdO3eW/IMB4BPY8wPA53Xu3FkLFizwmLd9+3bFxsZKkr766iv17dvX4/6OHTvqpZdeUm5urvz8/CRJbdq0KTD222+/rZdeeknffvutzp07p5ycHAUHB5fSIwHgCyg/AHxeUFCQ6tev7zHv6NGj7v82xsjhcHjcX9hO7aCgII/b//73vzVkyBA988wz6tGjh1wul1auXFngfCEANxbKD4Ayr0mTJtqyZYvHvK1bt6phw4buvT6F+de//qXIyEhNnjzZPe/QoUOllhOAb6D8ACjzHn/8cbVt21Z/+ctfNHjwYG3btk2vvvqq5s+ff8X16tevr8OHD2vlypVq27at/vGPf1z1nCAAZR+XugMo81q3bq3Vq1dr5cqVatasmaZNm6a4uDiPK70K07dvXz366KMaO3asbrnlFm3dulVTp069PqEBWIarvQAAgK2w5wcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANgK5QcAANjK/wcGJhwfx257HgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Hora de inicio y hora de fin de cada artista.\n", "comienzo = [sum(t * lp.value(x[i, t]) for t in H) for i in A]\n", "fin = [comienzo[i] + d[f\"A_{i + 1}\"] for i in range(len(A))]\n", "\n", "# Grafica de la solución\n", "plt.hlines(A, comienzo, fin, linewidth=35)\n", "\n", "# Etiqueta del eje x\n", "plt.xlabel(xlabel=\"Hora\")\n", "\n", "# Etiqueta del eje y\n", "plt.ylabel(ylabel=\"Artista\")\n", "\n", "# Título de la gráfica\n", "plt.title(\"Itinerario de Presentaciones\")\n", "\n", "# Rango del eje x\n", "plt.xlim([0.9, 13.1])\n", "\n", "# Dígitos del eje x\n", "plt.xticks(H + [13])\n", "\n", "# Borde vacío al rededor de las barras\n", "plt.margins(0.1)" ] }, { "cell_type": "markdown", "id": "2c390f8b", "metadata": {}, "source": [ "## Créditos" ] }, { "cell_type": "markdown", "id": "hired-insulation", "metadata": {}, "source": [ "Equipo Principios de Optimización
\n", "Autores: Alejandro Mantilla, Ariadna De Ávila, Alfaima Solano
\n", "Desarrollo: Alejandro Mantilla, Alfaima Solano
\n", "Última fecha de modificación: 08/04/2023" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" } }, "nbformat": 4, "nbformat_minor": 5 }